package com.jackwoo.jerrymouse.util;

/**
 * Author: StupidZhe
 * Date: 2019/11/29
 * Desc:
 **/
import java.util.HashMap;
import java.util.Map;

/**
 * @author lixk
 * @description 魔数工具类
 */
public class MagicNumberUtil {
    /**
     * 魔数到文件类型的映射集合
     */
    public static final Map<String, TYPES> types = new HashMap<>();

    public enum TYPES {
        jpg, png, gif, webp, clazz;
    }

    static {
        // 图片，此处只提取前六位作为魔数
        types.put("FFD8FF", TYPES.jpg);
        types.put("89504E", TYPES.png);
        types.put("474946", TYPES.gif);
        types.put("524946", TYPES.webp);
        types.put("CAFEBABE", TYPES.clazz);
    }

    /**
     * 根据文件的字节数据获取文件类型
     *
     * @param data 文件字节数组数据
     * @return
     */
    public static TYPES getFileType(byte[] data) {
        //提取前六位作为魔数
        String magicNumberHex = getHex(data, 6);
        TYPES name = types.get(magicNumberHex);
        if (name == null) {
            magicNumberHex = getHex(data, 8);
            name = types.get(magicNumberHex);
        }
        return name;
    }

    /**
     * 获取16进制表示的魔数
     *
     * @param data              字节数组形式的文件数据
     * @param magicNumberLength 魔数长度
     * @return
     */
    public static String getHex(byte[] data, int magicNumberLength) {
        //提取文件的魔数
        StringBuilder magicNumber = new StringBuilder();
        //一个字节对应魔数的两位
        int magicNumberByteLength = magicNumberLength / 2;
        for (int i = 0; i < magicNumberByteLength; i++) {
            magicNumber.append(Integer.toHexString(data[i] >> 4 & 0xF));
            magicNumber.append(Integer.toHexString(data[i] & 0xF));
        }

        return magicNumber.toString().toUpperCase();
    }

}
